Skip to content

fix: 初回接続失敗を再接続ループに委ねて無音恒久化を防ぐ#29

Merged
hitalin merged 3 commits into
mainfrom
fix/initial-connect-retry-loop
Jul 3, 2026
Merged

fix: 初回接続失敗を再接続ループに委ねて無音恒久化を防ぐ#29
hitalin merged 3 commits into
mainfrom
fix/initial-connect-retry-loop

Conversation

@hitalin

@hitalin hitalin commented Jul 3, 2026

Copy link
Copy Markdown
Owner

背景

hitalin/notedeck#506 の精査で特定した構造欠陥の notecli 側。connect() の初回ハンドシェイク失敗は Err を返すのみで、再接続ループは一度確立した connection_task 内にしか存在せず、「起動直後のネットワーク未確立 = 永久にストリームなし」が起きうる (PR #28 の本文で別 PR 対応と明記していたもの)。

変更

  • 初回接続失敗でも Err にせず connection_task を spawn し、既存の Equal Jitter バックオフループに最初から委ねる (connection_task の initial_ws を Option 化)
  • 接続状態は stream-status (connected / reconnecting) でフロントに伝わる。初回失敗時の connect() は reconnecting を emit する
  • 回帰テスト追加: 到達不能ホストへの connect が Ok を返し、ハンドルがコマンドを受け付け、disconnect で backoff 中の task を終了できる

検証

  • cargo clippy クリーン / cargo test 170 件全通過 (新規 1 件含む)
  • notedeck 側で [patch] によるローカル統合ビルド確認済み (公開 API 不変)

🤖 Generated with Claude Code

hitalin added 3 commits July 3, 2026 09:44
connect() は初回ハンドシェイク失敗で Err を返すだけで、再接続ループは
一度セッションが確立した connection_task 内にしか存在しなかった。
起動直後のネットワーク未確立などで初回だけ失敗すると、再試行の責務が
宙に浮き「永久にストリームなし」になっていた (notedeck#506 で顕在化
した無音恒久化の構造側)。

初回失敗時も connection_task を spawn し、既存の Equal Jitter バック
オフループに最初から任せる。接続の生死は stream-status イベント
(connected / reconnecting) でフロントへ伝わる。
旧テストは cmd channel の生存しか見ておらず、「ループに入らず return
する」ミューテーションでも通ってしまう vacuous なものだった。
ChannelEmitter で reconnecting の 2 回目 (= ループ冒頭の emit) を待つ
形にし、ミューテーション注入で FAILED になることを確認済み。
フロントは復帰時にリスナーを張り直してから connect を呼び直すが、
既存接続への冪等 return は status を emit しないため、背景化中に
取り逃した状態遷移を補正できず、JS 側が「resolve = connected」と
楽観的に見なすロジックを持たざるを得なかった (初回失敗を Err に
しなくなったことでこの楽観が誤りになる)。ConnectionHandle に実状態の
AtomicBool を持たせ、冪等 return 時に connected / reconnecting を
正しく emit する。フロントは status イベントだけを信じればよくなる。
@hitalin hitalin merged commit 088b249 into main Jul 3, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant